home *** CD-ROM | disk | FTP | other *** search
-
- /**
-
- # # # #
- ## ## # # # ##### # # # ###### ##### #### ######
- # # # # # # # # # # # # # # # #
- # # # # # # # # # # ##### # # #### #####
- # # # # # # # # # # ##### # #
- # # # # # # # # # # # # # # #
- # # #### ###### # # # ###### # # #### ######
-
- #####
- # # # # #### ##### ###### # #
- # # # # # # ## ##
- ##### # #### # ##### # ## #
- # # # # # # #
- # # # # # # # # #
- ##### # #### # ###### # #
-
- Copyright: Robert Grant, 1993
-
- **/
-
- #define _XOPEN_SOURCE
- #define _ALL_SOURCE
-
- /* includes */
-
- #include <stdio.h>
- #include <math.h>
- #include <stdlib.h>
-
- #include <graphics.h>
- #include <messages.h>
- #include <eventHandler.h>
- #include <clientManager.h>
- #include <objectManager.h>
-
- #include <ext_mine.h>
-
- /* Globals */
-
- /* Macros */
-
- int initMine(object_t *theMine, mineExt_t *mineData, init_t *event) {
-
- serverEventMsg_t ev;
- createObject_t object;
- changePanel_t panel;
- object_t *parent;
- parent = event->parent;
- if (mineData->fired)
- return 0;
- mineData->fired = 100;
- (void)memcpy(&theMine->coords,
- &parent->coords, sizeof(viewpoint));
- theMine->coords.rot.z = 0;
- theMine->coords.loc.y -= 7.5;
- strcpy(object.name, theMine->name);
- strcpy(object.type, theMine->type);
- memcpy(&object.coords, &theMine->coords, sizeof(viewpoint));
- object.class = MANAGED;
- composeServerEventMessage(&ev, CREATE, OBJECT, NULL, &object);
- broadcast(SERVEREVENT, sizeof(ev), &ev);
- panel.type = PANEL_VALUE;
- sprintf(panel.name, "biwing:mine:%s", strchr(theMine->name, '-') + 1);
- panel.value = 1;
- composeServerEventMessage(&ev, CHANGE, CHG_PANEL, "biwing", &panel);
- sendMessage(theMine->socket, SERVEREVENT, sizeof(serverEventMsg_t), &ev);
- theMine->collider = createCollider();
- if (!theMine->collider) {
- fprintf(stderr, "Can't get space for collision detection!\n");
- return 0;
- }
- theMine->collider->obj = theMine;
- theMine->collider->type = OBJ_DYNAMIC;
- theMine->collider->boundType = BOX;
- theMine->collider->box[0].x = -2.5;
- theMine->collider->box[0].y = -2.5;
- theMine->collider->box[0].z = -2.5;
- theMine->collider->box[1].x = 2.5;
- theMine->collider->box[1].y = 2.5;
- theMine->collider->box[1].z = 2.5;
- addCollider(theMine->collider);
- return 1;
- }
-
- void moveMine(object_t *theMine, mineExt_t *mineData, move_t *event) {
-
- serverEventMsg_t ev;
- changePanel_t panel;
-
- if (mineData->fired) {
- mineData->fired--;
- if (mineData->fired == 0) {
- ev.type = DELETE;
- strcpy(ev.event.moveEvent.name, theMine->name);
- broadcast(SERVEREVENT, sizeof(serverEventMsg_t), &ev);
- panel.type = PANEL_VALUE;
- sprintf(panel.name, "biwing:mine:%s", strchr(theMine->name, '-') + 1);
- panel.value = 0;
- composeServerEventMessage(&ev, CHANGE, CHG_PANEL, "biwing", &panel);
- sendMessage(theMine->socket, SERVEREVENT, sizeof(serverEventMsg_t), &ev);
- removeCollider(theMine->collider);
- free(theMine->collider);
- theMine->collider = NULL;
- return;
- }
- }
- }
-
- int checkMineCollision(object_t *theMine, mineExt_t *mineData,
- collideEvent_t *event) {
-
- object_t *theCollider;
- termEvent_t term;
- theCollider = event->obj;
-
- if (theMine->parent == theCollider)
- return 0;
- if (theMine->parent == theCollider->parent)
- return 0;
- mineData->fired = 1;
- term.type = TERM_NOTIFY_EVENT;
- sendEventByRef(theMine->parent, &term);
- return 1;
- }
-
-
- int addMineExtensions(object_t *theObject) {
-
- mineExt_t *temp = NULL;
- int i;
- if ((temp = (mineExt_t *)malloc(sizeof(mineExt_t))) == NULL) {
- fprintf(stderr, "Can't allocate space for mine extension!\n");
- return 0;
- }
- temp->fired = 0;
- addEventHandler(theObject, MOVE_EVENT, temp, moveMine);
- addEventHandler(theObject, INIT_EVENT, temp, initMine);
- addEventHandler(theObject, COLLISION_NOTIFY_EVENT, temp, checkMineCollision);
- }
-
- int installMineExtensions() {
-
- installEventHandlerCreator("mine", addMineExtensions);
- }
-
-